﻿using System;
using System.Threading;

namespace Job.Core.Data
{
    /// <summary>
    /// Id 产生器。
    /// </summary>
    public interface IIdBuilder<T>
    {
        /// <summary>
        /// 产生一个 Id。
        /// </summary>
        /// <returns>Id。</returns>
        T MakeId();        
    }

    /// <summary>
    /// 时间 Id 产生器，用当时的时间产生 18 位长度，为 yyyyMMddHHmmssffff 值的 long 型 Id。
    /// 考虑使用静态实例使用此类。
    /// </summary>    
    public sealed class TimeIdBuilder : IIdBuilder<long>
    {
        #region IIdBuilder Members

        private object syncObject = new object();
        private long lastValue = 0;

        /// <summary>
        /// 产生一个 long 型的 Id。
        /// </summary>
        /// <returns>Id。</returns>
        public long MakeId()
        {            
            long value = 0;

            lock (syncObject)
            {
                while(true)
                {
                    value = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssffff"));

                    //相等时让线程睡眠一毫秒再继续产生。
                    if (value == lastValue)
                    {
                        Thread.Sleep(1);
                        continue;
                    }
                    else
                    {
                        lastValue = value;
                        break;
                    }
                }
            }

            return value;
        }

        #endregion
    }
}